package com.code.config.swagger;

import com.code.commons.enums.EnvironmentEnum;
import com.code.commons.web.constants.HeaderConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * swagger相关的配置
 *
 * @author tangyifei
 * @since 2019-5-24 14:36:28
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Autowired
    private Environment env;

    @Bean
    public Docket demo1ApiDocket() {
        List<Parameter> pars = new ArrayList<>(1 << 3);
        //X-Token
        ParameterBuilder xTokenPar = new ParameterBuilder();
        xTokenPar.name("X-Token").description("X-Token, 登录接口不需要传，其他接口必传")
                .modelRef(new ModelRef("string")).parameterType("header")
                //header中的X-Token参数必填，登陆接口不需要
                .required(true).defaultValue("1").build();
        pars.add(xTokenPar.build());
        //调用来源
        ParameterBuilder callSourcePar = new ParameterBuilder();
        callSourcePar.name(HeaderConstants.CALL_SOURCE).description("调用来源：WEB、PC、WECHAT、IOS、ANDROID")
                .modelRef(new ModelRef("string")).parameterType("header")
                //header中的Call-Source参数必填，传空也可以
                .required(true).defaultValue("PC").build();
        pars.add(callSourcePar.build());
        //APP版本号
        ParameterBuilder appVersionPar = new ParameterBuilder();
        appVersionPar.name(HeaderConstants.APP_VERSION).description("app版本号：1.0")
                .modelRef(new ModelRef("string")).parameterType("header")
                //header中的app版本号参数必填，传空也可以
                .required(true).defaultValue("1.0").build();
        pars.add(appVersionPar.build());
        //api版本号
        ParameterBuilder apiVersionPar = new ParameterBuilder();
        apiVersionPar.name(HeaderConstants.API_VERSION).description("api版本号：1.0")
                .modelRef(new ModelRef("string")).parameterType("header")
                //header中的app版本号参数必填，传空也可以
                .required(true).defaultValue("1.0").build();
        //根据每个方法名也知道当前方法在设置什么参数
        pars.add(apiVersionPar.build());
        ParameterBuilder apiLanguagePar = new ParameterBuilder();
        apiLanguagePar.name(HeaderConstants.LANGUAGE).description("语言：中文传zh_CN，英文传en_US，韩文传ko_KR，日文传ja_JP，中文繁体传zh_HK")
                .modelRef(new ModelRef("string")).parameterType("header")
                .required(false).defaultValue("zh_CN").build();
        //根据每个方法名也知道当前方法在设置什么参数
        pars.add(apiLanguagePar.build());
        //app变更版本说明
        ParameterBuilder apiVersionContentPar = new ParameterBuilder();
        apiVersionContentPar.name(HeaderConstants.APP_VERSION_CONTENT).description("app变更版本说明")
                .modelRef(new ModelRef("string")).parameterType("header")
                //header中的app版本号参数必填，传空也可以
                .required(false).defaultValue("").build();
        //根据每个方法名也知道当前方法在设置什么参数
        pars.add(apiVersionContentPar.build());
        return new Docket(DocumentationType.SWAGGER_12)
                .enable(!EnvironmentEnum.isProdEnv(env))
                .groupName("WHITECOIN-DAPP-USER")
                .apiInfo(new ApiInfoBuilder().title("WHITECOIN-DAPP-USER").description("白币DAPP相关用户模块API").build())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.code.web.user"))
                .paths(PathSelectors.any())
                .build().globalOperationParameters(pars);
    }

    @Bean
    public Docket demo2ApiDocket() {
        List<Parameter> pars = new ArrayList<>(1 << 3);
        //X-Token
        ParameterBuilder xTokenPar = new ParameterBuilder();
        xTokenPar.name("X-Token").description("X-Token")
                .modelRef(new ModelRef("string")).parameterType("header")
                //header中的X-Token参数必填
                .required(true).defaultValue("1").build();
        pars.add(xTokenPar.build());
        //调用来源
        ParameterBuilder callSourcePar = new ParameterBuilder();
        callSourcePar.name(HeaderConstants.CALL_SOURCE).description("调用来源：WEB、PC、WECHAT、IOS、ANDROID")
                .modelRef(new ModelRef("string")).parameterType("header")
                //header中的Call-Source参数必填，传空也可以
                .required(true).defaultValue("PC").build();
        pars.add(callSourcePar.build());
        //APP版本号
        ParameterBuilder appVersionPar = new ParameterBuilder();
        appVersionPar.name(HeaderConstants.APP_VERSION).description("app版本号：1.0")
                .modelRef(new ModelRef("string")).parameterType("header")
                //header中的app版本号参数必填，传空也可以
                .required(true).defaultValue("1.0").build();
        pars.add(appVersionPar.build());
        //api版本号
        ParameterBuilder apiVersionPar = new ParameterBuilder();
        apiVersionPar.name(HeaderConstants.API_VERSION).description("api版本号：1.0")
                .modelRef(new ModelRef("string")).parameterType("header")
                //header中的app版本号参数必填，传空也可以
                .required(true).defaultValue("1.0").build();
        //根据每个方法名也知道当前方法在设置什么参数
        pars.add(apiVersionPar.build());
        ParameterBuilder apiLanguagePar = new ParameterBuilder();
        apiLanguagePar.name(HeaderConstants.LANGUAGE).description("语言：中文传zh_CN，英文传en_US，韩文传ko_KR，日文传ja_JP，中文繁体传zh_HK")
                .modelRef(new ModelRef("string")).parameterType("header")
                .required(false).defaultValue("zh_CN").build();
        //根据每个方法名也知道当前方法在设置什么参数
        pars.add(apiLanguagePar.build());
        //app变更版本说明
        ParameterBuilder apiVersionContentPar = new ParameterBuilder();
        apiVersionContentPar.name(HeaderConstants.APP_VERSION_CONTENT).description("app变更版本说明")
                .modelRef(new ModelRef("string")).parameterType("header")
                //header中的app版本号参数必填，传空也可以
                .required(false).defaultValue("").build();
        //根据每个方法名也知道当前方法在设置什么参数
        pars.add(apiVersionContentPar.build());
        return new Docket(DocumentationType.SWAGGER_12)
                .enable(!EnvironmentEnum.isProdEnv(env))
                .groupName("WHITECOIN-DAPP-AZ")
                .apiInfo(new ApiInfoBuilder().title("WHITECOIN-DAPP-AZ").description("白币DAPP相关AZ计划功能开发API").build())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.code.web.AZPlan"))
                .paths(PathSelectors.any())
                .build().globalOperationParameters(pars);
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("南京编码科技有限公司相关业务API")
                .description("接口写得好，联调通的早")
                .version("1.0")
                .build();
    }
}
